package thread;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 创建时间：2018年03月13日10:10 <br>
 * 作者：fuchaoyang <br>
 * 描述：
 */

public class TestSyn {
  private Integer xixi;

  // 锁代码块
  public void fun1() {
    // synchronized 后面的参数表示 锁的是什么。this表示锁的TestSyn的实例对象。
    synchronized (this) {

    }
  }

  // 声明在方法声明中,等同于fun1锁this
  public synchronized void fun2() {

  }

  // 锁代码块
  public void fun3() {
    // 这里锁的是.class，那么这个锁就是全局唯一的，单例中这么用
    synchronized (TestSyn.class) {

    }
  }

  public void fun4() {
    // 锁一个成员，那么访问这个成员时就需要拿到锁
    synchronized (xixi) {

    }
  }

  // 静态方法属于类，所以这里等同于 fun2 锁.class
  public synchronized static void fun5() {

  }

  private static final Lock mLock = new ReentrantLock();

  public void fun6() {
    // lock(), 如果获取了锁立即返回，如果别的线程持有锁，当前线程则一直处于休眠状态，直到获取锁
    //mLock.lock();

    // 尝试获取锁，如果没有拿到，则会等待time时间，还没拿到就执行else语句
    //tryLock(long time, TimeUnit unit)

    // tryLock 尝试获取锁
    if (mLock.tryLock()) {

      // 执行完任务后需要释放锁
      mLock.unlock();
    } else {
      // 如果没有拿到锁，也就是说别的线程抢占了锁，则可以不用代码，去做别的事情
    }
  }
}
